#include "main.h"
int main(int argc, const char *argv[])
{
	//搭建服务器端
	//1、创建套接字
	int S;
	if((S=socket(AF_INET,SOCK_STREAM,0))==-1){perror("创建套接字失败");return -1;}
	//2、绑定本机IP及端口
	struct sockaddr_in addr={0};
	addr.sin_family=AF_INET;
	addr.sin_port=htons(12345);
	addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	//addr.sin_addr.s_addr=inet_addr("192.168.65.128");
	if(bind(S,(struct sockaddr*)&addr,sizeof(addr))==-1){perror("绑定失败");return -1;}
	//3、监听
	listen(S,10);
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//创建套接字结构体数组
	struct pollfd pollbuf[50]={0};
	int pollbuf_len=0;
	//将服务器加入可读监视列表
	client_add(pollbuf,&pollbuf_len,S,POLLIN);
	client_add(pollbuf,&pollbuf_len,0,POLLIN);
	//循环阻塞监视
	printf("循环阻塞等待客户端请求\n");
	while(1)
	{
		//监视
		printf("开始监视%d列表\n",pollbuf_len);
		poll(pollbuf,pollbuf_len,-1);
		int i;
		for(i=0;i<pollbuf_len;i++)
		{
			printf("比较%d\n",i);
		if(pollbuf[i].revents==POLLIN)
			{
				printf("描述符<%d>发生变化\n",i);
				break;
			}
		}
		if(i>=pollbuf_len)break;
		if(i==0)//服务器描述符变化
		{
			int CC=accept(S,NULL,NULL);
			client_add(pollbuf,&pollbuf_len,CC,POLLIN);
			printf("客户端<%d>建立连接\n",pollbuf_len);
		}
		else if(pollbuf[i].fd==0)//标准输入流描述符变化
		{
			char buf[128]={0};
			scanf("%s\n",buf);
			printf("%s\n",buf);
		}
		else//客户端描述符变化
		{
			char buf[128]={0};
			if(read(pollbuf[i].fd,&buf,128)==0)
			{
				client_del(pollbuf,&pollbuf_len,i);
				close(pollbuf[i].fd);
				printf("客户端<%d>断开连接\n",i);
				continue;
			}
			printf("客户端<%d>发来消息:%s\n",i,buf);
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	close(S);
	return 0;
}
